1 ב' פתרון בחינת הבגרות פרק א - :1 Ï פתרון בשפת :Jv מציאת הזוג הראשון במחסנית 1 הגדול מהזוג המקסימאלי במחסנית 2. אם הוא גדול מהזוג בעל הסכום המקסימאלי, הוא בהכרח גדול מסכום כל הזוגות הסמוכים במחסנית 2. יעילות הפתרון היא O(n) --- פעולה המחזירה את סכום זוג האיברים הסמוכים ---// --- הגדול ביותר במחסנית ---// --- הנחה : במחסנית יש לפחות שני איברים ---// pulic sttic int mxsumcuple(stck<integer> st2) int x = st2.pop(); int y = st2.pop(); int sum = x + y; while (!st2.isempty()) x = y; y = st2.pop(); if (x + y > sum) sum = x + y; return sum; --- פעולה המחזירה את סכום זוג האיברים הסמוכים הראשון ---// --- הגדול ביותר במחסנית 1 הגדול מסכום כל זוגות ---// --- המספרים הסמוכים במחסנית השנייה ---// --- הנחה : בכל מחסנית יש לפחות 2 איברים ---// pulic sttic int mxcuplest1 (Stck<Integer> st1, Stck<Integer> st2) int x = st1.pop(); int y = st1.pop(); int sum = mxsumcupple(st2); while (!st1.isempty() && (x+y) < sum ) x = y; y = st1.pop(); if (st1.isempty()) return 0; return x+y;
2 בדיקת הסכום של כל זוג מספרים ממחסנית 1 מול כל זוגות המספרים במחסנית 2, עד אשר יימצא הזוג הראשון במחסנית 1 הגדול מכל הזוגות שבמחסנית 2. יעילותו של פתרון זה היא ) 2 O(n --- פעולה המחזירה את סכום זוג האיברים הסמוכים הראשון ---// --- הגדול ביותר במחסנית 1 הגדול מסכום כל זוגות ---// --- המספרים הסמוכים במחסנית השנייה ---// --- הנחה : בכל מחסנית יש לפחות 2 איברים ---// pulic sttic int mxcuplest1 (Stck<Integer> st1, Stck<Integer> st2) Stck<Integer> sttemp = new Stck<Integer>(); int x1 = st1.pop(); int y1 = st1.pop(); int sum1 = x1 + y1; oolen igger = true; while (!st1.isempty() && igger) int x2 = st2.pop(); int y2 = st2.pop(); sttemp.push(x2); sttemp.push(y2); int sum2 = x2 + y2; if (sum1 <= sum2) igger = flse; while (!st2.isempty() && igger) x2 = y2; y2 = st2.pop(); sttemp.push(y2); sum2 = x2 + y2; if (sum1 <= sum2) igger = flse; if (igger) return sum1; while (! sttemp.isempty()) st2.push(sttemp.pop()); igger = true; x1 = y1; y1 = st1.pop(); sum1 = x1 + y1; return 0;
3 - פתרון בשפת #C נכתב ע"י ראמי גבאלי: מציאת הזוג הראשון במחסנית 1 הגדול מהזוג המקסימאלי במחסנית 2. אם הוא גדול מהזוג בעל הסכום המקסימאלי, הוא בהכרח גדול מסכום כל הזוגות הסמוכים במחסנית 2. יעילות הפתרון היא O(n) פעולה מחזירה את זוג האיברים הסמוכים הגדול ביותר // pulic sttic int MxTwo(Stck<int> s) Stck<int> s2 = new Stck<int>(); int mx = 0; int x, y; while (!s.isempty()) x = s.pop(); s2.push(x); if (!s.isempty()) y = s.top(); if (x + y > mx) mx = x + y; while (!s2.isempty()) s.push(s2.pop()); return mx; פעולה מחזירה את סכום של זוג האיברים הסמוכים // pulic sttic int SumB(Stck<int> st1,stck<int> st2) int x, y, m; while (!st1.isempty()) x = st1.pop(); if (!st1.isempty()) y = st1.top(); m=mxtwo(st2); if (x + y > m) return x + y; return 0;
4 פתרון רקורסיבי: נכתב ע"י ראמי ג'באלי בוליאני ומשתנה מספרים שני,מחסנית המקבלת פעולה */ זוג מכל גדול המספרים זוג סכום אם "אמת" ומחזירה * אחרת "שקר"-ו,אחרת במחסנית סמוכים איברים * */ pulic sttic ool IsBig2(Stck<int> s, int x, int y, ool flg2) ool flg; if (s.isempty() && flg2 == flse) flg = true; else if (s.isempty() && flg2) flg = flse; else int = s.pop(); if (!s.isempty()) int = s.top(); if ( + >= x + y) flg = flse; flg2 = true; flg = IsBig2(s, x, y, flg2); s.push(); return flg; הסמוכים האיברים זוג הסכום את מחזירה פעולה --- // pulic sttic int Sum2(Stck<int> s1, Stck<int> s2) if (s1.isempty()) return 0; else int x = s1.pop(); if (!s1.isempty()) int y = s1.top(); if (IsBig2(s2, x, y, flse)) return x + y; return Sum2(s1, s2);
5 נכתב ע"י ראמי ג'באלי: בדיקת הסכום של כל זוג מספרים ממחסנית 1 מול כל זוגות המספרים במחסנית 2, עד אשר יימצא הזוג הראשון במחסנית 1 הגדול מכל הזוגות שבמחסנית 2. יעילותו של פתרון זה היא ) 2 O(n pulic sttic ool IsBig(Stck<int> s, int x, int y) Stck<int> s2 = new Stck<int>(); ool flg = true; int, ; while (!s.isempty()) = s.pop(); if (!s.isempty()) = s.top(); if (x + y <= + ) flg = flse; s2.push(); while (!s2.isempty()) s.push(s2.pop()); return flg; --- פעולה מחזירה את סכום של זוג האיברים הסמוכים ---// pulic sttic int Sum(Stck<int> st1, Stck<int> st2) int x, y; while (!st1.isempty()) x = st1.pop(); if (!st1.isempty()) y = st1.top(); if (IsBig(st2, x, y) == true) return x + y; return 0;
6 :2 Ï פתרון בשפת :Jv --- ט.כניסה: רשימת מספרים ---// --- ט.יציאה: מוחזרת רשימת הטווחים ---// pulic sttic List<RngeNode> creterngenode (List<Integer> sourcelist) int from, to; List<RngeNode>rngeList = new List<RngeNode>(); Node<RngeNode> pos2 = null; Node<Integer>pos1 = sourcelist.getfirst(); while (pos1!= null) from = pos1.getinfo(); to = from; pos1 = pos1.getnext(); while (pos1!= null && pos1.getinfo()-1 == to) to = pos1.getinfo(); pos1 = pos1.getnext(); RngeNode rn = new RngeNode(from, to); pos2 = rngelist.insert(pos2, rn); return rngelist;
7 - פתרון בשפת #C נכתב ע"י ראמי גבאלי: הטווחים רשימת מחזירה פעולה// pulic sttic List<RngeNode> CreteRngeList (List<int> sourcelist) Node<int> p = sourcelist.getfirst(); List<RngeNode> list=new List<RngeNode>(); Node<RngeNode> q = list.getfirst(); int x, y=0, z; z = p.getinfo(); אם הרשימה מורכבת מאיבר אחד // null) if (p.getnext() == q = list.insert(q, new RngeNode(z,z)); else while (p.getnext()!= null) x = p.getinfo(); y = p.getnext().getinfo(); if (y - x == 1) p = p.getnext(); else q = list.insert(q, new RngeNode(z, x)); z = y; p = p.getnext(); q = list.insert(q, new RngeNode(z, y)); return list;
8 פתרון בשפת #C נכתב ע"י דורון כהן, תלמיד בתיכון מכבים-רעות: pulic sttic List<RngeNode> CreteRngeList (List<int> sourcelist) - הפעולה מקבלת רשימה של מספרים שלמים ומחזירה את רשימת הטווחים שלה. // הנחה : הרשימה מורכבת לפחות מאיבר אחד. // הסבר הפתרון : בפתרון יש שימוש בשני מספרים הראשון // הוא תחילת כל רצף (בי) והאחרון הוא סוף כל רצף(אף).לרצף הראשון // נכניס את ערכה של החוליה הראשונה למשתנה הראשון. לאחר מכן נעבור // בלולאה על הרשימה עד האיבר האחד לפני האחרון וכאשר ערך החוליה // הבאה הוא לא המספר העוקב של ערך החוליה הנוכחית נכניס למשתנה // השני את ערך החוליה הנוכחית. לאחר מכן, נכניס לרשימת הטווחים את // הרצף הנוכחי ונשנה את המשתנה הראשון להיות המספר הראשון ברצף הבא // בסוף יש טיפול מיוחד בחוליה האחרונה אנו מכניסים את הרצף האחרון // שמתחיל מהמשתנה הראשון וסופו הינו ערכו של החוליה האחרונה // List<RngeNode> L = new List<RngeNode>(); Node<int> pos1 = sourcelist.getfirst(); Node<RngeNode> pos2 = null; int = pos1.getinfo(), f; while (pos1.getnext()!= null) if (pos1.getinfo() + 1!= pos1.getnext().getinfo()) f = pos1.getinfo(); pos2 = L.Insert(pos2, new RngeNode(, f)); = pos1.getnext().getinfo(); pos1 = pos1.getnext(); L.Insert(pos2, new RngeNode(, pos1.getinfo())); return L;
9 :3 Ï - פתרון בשפת #C נכתב ע"י דיתה אוהב-ציון: clss Messge משתנה סטטי - מונה הודעות ) מיספור אוטומטי ( // 0; = CountMessge privte sttic int privte int Id; מספר סידורי של ההודעה // privte string Nme; שם השולח // privte int Size; גודל ההודעה // clss MessgeBox privte string Owner; שם בעל התיבה // privte const int MxSize = 100; גודל מקסימלי // privte List<Messge> Box; רשימת הודעות פעילות // privte List<Messge> Bin; רשימת הודעות בסל האשפה // הנחות: גודל התיבה מוגדר כקבוע - זהה לכל התיבות. בתיבת ההודעות הפעילות, ההודעות ממוינות בסדר יורד. ההודעה החדשה ביותר - בסל האשפה ההודעות ממוינות בסדר יורד. ראשונה. א. ב. pulic ool AddMessge(Messge m) int freesise= MxSize - (GetActiveSize() + GetBinSize()); אם יש מקום פנוי בתיבה // if (freesise >= m.getsize()) Box.Insert(null, m); return true; ג. אם המקום הפנוי+ גודל ההודעות בסל האשפה גדול או שווה לגודל ההודעה החדשה // if (GetBinSize()+ freesize >= m.getsize()) מחיקת הודעות מסל האשפה עד שיתקבל המקום הפנוי הנדרש// while (freesise < m.getsize()) freesise += RemoveFromBin(); Box.Insert(null, m); return true; return flse;
10 ד. (1) גודל התיבה הוגדר ע"י חבר מחלקה קבוע privte const int MxSize = 100; כל הגולשים מקבלים תיבה בגודל הקבוע. אין הבדל בין הגולשים ואין צורך להקצות לכל גולש משתנה שישמור את גודל התיבה שלו. מאחר ויש דרישה להקצות תיבות בגודל משתנה יש privte int MxSize; לשנות אותו לחבר מחלקה רגיל כך שניתן יהיה לשנות את ערכו לפי הדרישה והוא יהיה שונה לכל מופע של המחלקה - לכל תיבה יהיה גודל שונה. (השינוי בבנאי המחלקה שבו נוסיף שורה ;100 =,this.mxsize לאיתחול גודל התיבה. ( אין צורך לשנות את הפעולה מסעיף ג. השימוש בשם המשתנה אינו מתשנה בביצוע הפעולה כאשר הוא הופך מקבוע למשתנה מחלקה רגיל. (2)
11 qu 4 3 1 8 9 :4 Ï פתרון בשפת :Jv א. (1) טבלת מעקב ל- Sod1 qu st משפט זימון sod1(qu,st) qu x לא ריק? T 4 sod1 ( [3, 1, 8, 9], [] ) [9, 8, 1, 3, 4] [4, 3, 1, 8, 9] T 3 sod1 ( [1, 8, 9], [] ) [9, 8, 1, 3] [3, 1, 8, 9] T 1 sod1 ( [8, 9], [] ) [9, 8, 1] [1, 8, 9] T 8 sod1 ( [9], [] ) [9, 8] [8, 9] T 9 sod1 ( [], [] ) [9] [9] F qu טבלת מעקב ל- Sod2 9 8 1 3 4 (2) st 4 3 1 8 9 qu לא ריק? x sod2(qu,st) משפט זימון y qu st T 9 sod2([8, 1, 3, 4],[4, 3, 1, 8, 9]) 9 [8, 6, 2, 16, 18] [ ] T 8 sod2([1, 3, 4],[4, 3, 1, 8, 9]) 8 [8, 6, 2, 16] [9] T 1 sod2([3, 4],[4, 3, 1, 8, 9]) 1 [8, 6, 2] [8, 9] T 3 sod2([4],[4, 3, 1, 8, 9]) 3 [8, 6] [1, 8, 9] T 4 sod2([],[4, 3, 1, 8, 9]) 4 [8] [3, 1, 8, 9] F qu 8 6 2 16 18 qu אחרי ביצוע קטע הקוד: ב. ג. sod1 הופכת את איברי התור (מהסוף להתחלה), ומעתיקה את איברי התור למחסנית, כך שהאיבר שהיה בראש התור יהיה בתחתית המחסנית. קטע הקוד מכפיל את כל איברי התור פי 2.
12 פרק ב' מערכות מחשב ואסמבלר :5 ÏÈ :6 ÏÈ :7 ÏÈ :8 Ï
13 פרק ב' מבוא לחקר ביצועים :9 Ï :10 Ï :11 Ï :12 Ï
14 פרק ב' מודלים חישוביים הפתרון לפרק זה נכתב ע"י רחל לודמר. אינה שפה רגולרית. יש תלות מניה בין אורכי הרצפים של ו-. :13 ÏÈ L 1 - השפה L 2 -השפה היא רגולרית, נבנה עבורה אוטומט סופי דטרמיניסטי: היא שפה רגולרית, נבנה עבורה אוטומט סופי דטרמיניסטי: L 3 - השפה L4 L5 n n 1 = n 1, n%2 = 1 = L1 R( L4 ) ב. נתון ש- L 5 = n = n n 1 n+ k 2 k 1 k k n, k 1, k%2 = 1 n, k 1, k%2 = 1 : L5 הגדרת השפה = n t k t = n + k 2, n, k 1, k%2 = 1
15 :14 Ï א. המילה הקצרה ביותר היא 000$$. ב. האוטומט שמקבל את השפה L: 0 0 0 $ $ $ 0 0 0 0 q 0 0 1 0 0 1 0 q1 q2 q4 q5 q6 q7 המילה 001001 מתקבלת. מסלול חישוב : :15 Ï (i) א..1 q 0 1 0 1 0 0 q1 q4 q5 q6 q7 המילה 01010 מתקבלת. מסלול חישוב: (ii) (iii) המילה 0101 לא מתקבלת. (מילה מתקבלת באורך 4 חייבת להתחיל ב- ( 1 האורך המינימאלי של מילה מתקבלת הוא. 4 לדוגמא 1000. האורך המקסימאלי של מילה מתקבלת הוא. 6 לדוגמא 011000. השפה המוגדרת ע"י האוטומט היא: כל המילים מעל 0,1 שאורכן בין 4 ל- 6 (כולל) והתו הרביעי מהסוף הוא 1. ניסוח אחר : כל המילים המקיימות: L = w1 1 w2 w1, w2 0,1,0 w1 2, w2 = 3.2.3.4 ב. האוטומט המקבל את השפה L:, q0 q1 q2 q3 q5 q4
16 :16 Ï א. השלמת מכונת טיורינג עבור הפונקציה min(m,n) f(m,n)= כאשר m,n>0, כתובים בשפה האונרית וסימן # מפריד בניהם. תוצאת המכונה תיכתב בין שני $. ימין, / שמאל, / שמאל, # / # שמאל, 1 1 / א שמאל, / 1 ימין, /# # ב ימין /$, # ג שמאל, $ / Δ שמאל 1, / ימין 1, / ימין /$, Δ ב. תהליך החישוב של המכונה בעבור הקלט 1=m,1=n 1 # 1 Δ q 0 # 1 Δ q 1 # 1 Δ q 2 # Δ q 3 # Δ q 3 # Δ q0 $ Δ q 4 $ 1 Δ Δ q 4 $ 1 $ Δ q 5
17 Jv פרק ב' תכנות מונחה עצמים Animl ZooZoo :17 ÏÈ Test א. Mrine Reptile GoldFish Snke Crocodile Animl niml 0 1 2 3 count 0 1 2 3 4 ב. Snke Crocodile GoldFish Crocodile nme: snki len: 50 nme: Crocki1 len: 78 nme: goldi depth: 0.2 nme: Crocki3 len: 103 snki is hungry! Crwling: Ymmi Teeee **** Crocki1 is hungry! Crwling: Ymmi Finish eting Whmm **** goldi is hungry! Swimming Bloop loop **** Crocki3 is hungry! Crwling: Ymmi Finish eting Whmm **** פלט התכנית:
18 :18 ÏÈ כן. א. הינן חלק מהפעלות של,WhtIn1 WhtClss ולכן כל הפעולות של WhtClss יורשת מ- WhtIn1 ובכך היא עונה על התחייבותה לממש את הפעולה בממשק. כלומר - WhtIn1 מתפקדת כ- WhtOp ב. הפעולה לא תקינה. המחלקה יורשת מ- WhtClss ולכן עליה לזמן את הפעולה הבונה של מחלקת העל. התיקון : pulic WhtIn1(int numer, int num) super(numer); this.num = num; ג. הפעולה לא תקינה. הרשאת הגישה לתכונה numer היא,privte ולכן היא מוסתרת מהמחלקה. התיקון - זימון הפעולה :getnumer() pulic int clculte2() return (int)((this.getnumer() +this.num)/2); ד. (1) אי אפשר להסתמך על הפעולה בונה ברירת מחדל. מרגע שנוצרו פעולות בונות באחת ממחלקות-העל של,WhtIn2 התבטלה האופציה של פעולה בונה ברירת מחדל. (אם נסיר את הפעולות הבונות של המחלקות WhtClss ו- WhtIn1 יופעל בנאי המחדל). System.out.println(oj.clculte3(1000, 100, 10)); (2) p1 p2 p3 clculte3(p1,p2,p3) 1000 100 10 21,000 + 3* 10*10*10 24,000 clculte3(p1,p2) 1000 + 2*100*100 21,000 הפלט: 24,000 clculte3(p1) 1*1000 1000 כל הפעולות מוכרות במחלקה WhtIn2 שיורשת מכל המחלקות האחרות.
19 :19 ÏÈ א. (1) (2) העיקרון של שתי פעולות בונות הוא העמסה - overloding. המהדר בוחר את הפעולה המתאימה לפי סוג ומספר הפרמטרים המועברים. ב. הפעולה tostring מגדירה מחדש (דורסת - (overriding את הפעולה שהועברה בירושה. בתוך הפעולה יש זימון של הפעולה שהועברה בירושה.(inheritnce) Stm s 0 1 2 3 4 5 ג. (1) Stm Dvr Stm Dvr Dvr x : '*' x: '*' y: 0 x : '' x: '' y: 0 x: '' y: 0 פלט הלולאה בקטע עמודה זו לא תודפס s[0]: s[1]: s[2]: s[3]: s[4]: s[5]: : 2 x = * Dvr: x = * x = Dvr: x = Dvr: x = x = (2) פולימורפיזם - מערך מסוג מחלקת העל מפנה לאובייקטים מסוג מחלקת העל ומסוג תת המחלקה (היורשת). הורשה - אובייקט מתת-מחלקה מפעיל פעולה שירש ממחלקת העל (הפעולה.(print() pulic oolen isstm1 (Stm other) return this.x == other.x ; (3) (4) pulic oolen isstm2 (Stm other) return this.equls(other);
20 :20 Ï א. מסוג :CndleKind קטע קוד לבניית עצם בשם kind1 Rose שם הדגם: מערך colors1 המכיל את בצבעים: אדום, צהוב, ירוק צבעי הדגם: 899205 מס' דגם: 2010 כמות מרבית: String[]colors1 = "red", "yellow","green"; CndleKind kind1 = new CndleKind("Rose", 899205, colors1, 2010); :Fctory ב. כותרת ותכונות המחלקה - מערך פסי הייצור - מספר מרבי של ספי ייצור - מספר פסי הייצור הקיימים בפועל (בכל התכנית מתקיים: (current < mxline prodline mxline current pulic clss Fctory privte CndleKind [] prodline; pulic sttic int mxline = 12; privte int current; הפעולה הבונה: (לא נדרש בבחינה) pulic Fctory() this.prodline = new CndleKind[mxLine]; this.current = 0;
21 ג. פעולות שיתווספו למחלקה :CndleKind --- סעיף ג ' 1 //--- --- פעולה המחזירה את צבע הנר מדגם נתון שיתחילו בייצורו ---// pulic String strtcolorproduction() --- סעיף ג ' 2 --- // --- פעולה המחזירה את כמות הנרות המרבית ---// --- שניתן לייצר מדגם הנרות הנוכחי ---// pulic int posiileproductamount() פעולה שתתווסף למחלקה : Fctory --- סעיף ג ' 3 --- // --- פעולה המחזירה את הקוד של דגם הנר שניתן לייצר ---// --- זהו הנר שנמצא בכמות הקטנה ביותר במלאי, וניתן לייצרו ---// --- אם לא ניתן לייצר את הנר, יוחזר ---// 999 pulic int getcodeminimumamounts() Fctory fty = new Fctory(); :min() ד. קטע הקוד בפעולה int code = fty.getcodeminimumamounts(); // (1) while (code!= 999) CndleKind ck = fty.getprodline(code); // (2) String colortoproduce = ck.strtcolorproduction(); // (3) int mount = ck.posiileproductamount(); // (4) ck.updte(colortoproduce, mount); code = fty.getcodeminimumamounts(); // (1)
22 פרק ב' תכנות מונחה עצמים #C הפתרון לפרק זה נכתב ע"י טובי סטפ :21 ÏÈ
23 :22 ÏÈ
24 :23 ÏÈ
25 :24 Ï